package com.study.jdbc.frame;

import java.sql.Connection;
import java.sql.ParameterMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

/**
* @Name: JDBCAssist
* @Description: JDBC框架：jdbc增、删、改、查帮助类
* @Author: 李超	lc_jack@foxmail.com
* @CreateDate: 2017-2-19 下午3:09:47 
* @Version: V1.0
 */
public class JDBCAssist {
	
	private DataSource dataSource ;

	public JDBCAssist(DataSource dataSource) {
		this.dataSource = dataSource;
	}
	
	/**
	* @Name: update
	* @Description: jdbc更新（增、删、改）操作方法
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-2-19 下午3:34:23
	* @Parameters: @param sql sql语句
	* @Parameters: @param params sql语句中的参数
	* @Return: void 无
	 */
	public void update(String sql, Object ... params) {
		Connection conn = null ;
		PreparedStatement ps = null ;
		try {
			//获取数据库连接对象
			conn = dataSource.getConnection() ;
			//创建sql语句执行对象
			ps = conn.prepareStatement(sql) ;
			//预处理
			//获取sql语句占位符元信息对象
			ParameterMetaData metaData = ps.getParameterMetaData() ;
			//获取sql语句中占位符的个数
			int parameterCount = metaData.getParameterCount() ;
			//判断sql语句中的占位符和传进来的参数个数是否一致
			if(parameterCount > 0) {
				if(params == null || params.length == 0) {
					throw new IllegalArgumentException("参数个数不匹配！") ;
				}
				if(parameterCount != params.length) {
					throw new IllegalArgumentException("参数个数不匹配！") ;
				}
				//个数一致，设置参数
				for (int i = 0; i < parameterCount; i++) {
					ps.setObject(i+1, params[i]) ;
				}
			}
			//执行sql语句
			ps.executeUpdate() ;
		} catch (Exception e) {
			e.printStackTrace() ;
		} finally {
			//释放资源
			close(null, ps, conn) ;
		}
	}

	/**
	* @Name: query
	* @Description: jdbc查询
	* 说明：约定优于编码
	* 	约定：JavaBean中的属性名称必须和数据库中的字段名称保持一致
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-2-19 下午3:39:27
	* @Parameters: @param sql sql查询语句
	* @Parameters: @param rsh sql语句执行结果集处理类
	* @Parameters: @param params sql语句查询参数
	* @Return: Object 返回查询结果
	 */
	public Object query(String sql, ResultSetHandle rsh, Object ... params) {
		Connection conn = null ;
		PreparedStatement ps = null ;
		ResultSet rs = null ;
		//查询结果对象
		Object result = null ;
		try {
			//获取数据库连接
			conn = dataSource.getConnection() ;
			//创建sql语句执行对象
			ps = conn.prepareStatement(sql) ;
			//预处理
			//得到sql语句中占位符的个数
			ParameterMetaData parameterMetaData = ps.getParameterMetaData() ;
			int parameterCount = parameterMetaData.getParameterCount() ;
			//判断占位符的个数与传入参数的个数是否一致
			if(parameterCount > 0) {
				if(params == null || params.length == 0) {
					throw new IllegalArgumentException("参数个数不匹配！") ;
				}
				if(parameterCount != params.length) {
					throw new IllegalArgumentException("参数个数不匹配！") ;
				}
				//参数个数匹配，设置参数
				for (int i = 0; i < parameterCount; i++) {
					ps.setObject(i+1, params[i]) ;
				}
			}
			//执行查询语句
			rs = ps.executeQuery() ;
			//处理查询结果集：将查询结果集封装到JavaBean中
			result = rsh.handle(rs) ;
		} catch (Exception e) {
			e.printStackTrace() ;
		} finally {
			//释放资源
			close(rs, ps, conn) ;
		}
		return result ;
	}
	
	
	/**
	* @Name: close
	* @Description: 释放资源
	* @Author: 李超	lc_jack@foxmail.com
	* @Version: V1.0
	* @CreateDate: 2017-2-19 下午3:35:11
	* @Parameters: @param rs sql语句结果集对象
	* @Parameters: @param s sql语句执行对象
 	* @Parameters: @param conn 数据库连接对象
	* @Return: void 无
	 */
	private void close(ResultSet rs, Statement s, Connection conn) {
		if(rs != null) {
			try {
				rs.close() ;
			} catch (Exception e) {
				e.printStackTrace() ;
			} finally {
				rs = null ;
			}
		} 
		if(s != null) {
			try {
				s.close() ;
			} catch (Exception e) {
				e.printStackTrace() ;
			} finally {
				s = null ;
			}
		} 
		if(conn != null) {
			try {
				conn.close() ;
			} catch (Exception e) {
				e.printStackTrace() ;
			} finally {
				conn = null ;
			}
		} 
	}
	

}
